package gui2;

import algoritmo2.Controlador;
import java.awt.event.ComponentEvent;
import javax.swing.JPanel;
import java.awt.Dimension;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Font;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import javax.swing.ImageIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;


import java.awt.event.ComponentListener;
import java.util.ArrayList;

import javax.swing.JTextArea;

public class PanelPrincipal extends JPanel {

    private static final long serialVersionUID = 1L;
    private JLabel tituloLabel = null;
    private JLabel autoresLabel = null;
    private JTabbedPane pestanasTabbedPane = null;
    private JPanel algoritmoPanel = null;
    private JPanel estudio = null;
    private JLabel instruccionesLabel = null;
    private JButton ejecutarBoton = null;
    private JPanel ayudaPanel = null;
    private JSlider probMutacion = null;
    private JLabel labelValueProbMut = null;
    private JSlider probCruce = null;
    private JLabel labelTitleProbMut = null;
    private JLabel labelTitleProbCruce = null;
    private JLabel labelValueProbCruc = null;
    private JTextField tamanioPoblacion = null;
    private JLabel labelTitleTamanioPoblacion = null;
    private JLabel labelTitleNumMaxGeneraciones = null;
    private JTextField numMaximoGeneraciones = null;
    private JLabel labelTitleTolerancia = null;
    private JCheckBox escalado = null;
    private JTextField escaladoValor = null;
    private JLabel labelElitismo = null;
    private JCheckBox checkElitismo = null;
    private JLabel labelTitleMinValor1 = null;
    private JCheckBox checkVariarProbCruce = null;
    private JTextField valorMinimoProbCruce = null;
    private JLabel labelTitleMaxValor = null;
    private JLabel labelTitlePaso = null;
    private JTextField valorMaximoProbCruce = null;
    private JTextField pasoProbCruce = null;
    private JCheckBox checkEstudio = null;
    private JCheckBox checkVariarProbMutacion = null;
    private JLabel labelTitleMinValor2 = null;
    private JTextField valorMinimoProbMutacion = null;
    private JLabel labelTitleMaxValor1 = null;
    private JTextField valorMaximoProbMutacion = null;
    private JLabel labelTitlePaso1 = null;
    private JTextField pasoProbMutacion = null;
    private JCheckBox checkVariarNumGeneraciones = null;
    private JLabel labelTitleMinValor21 = null;
    private JTextField valorMinimoNumGeneraciones = null;
    private JLabel labelTitleMaxValor11 = null;
    private JTextField valorMaximoNumGeneraciones = null;
    private JLabel labelTitlePaso11 = null;
    private JTextField pasoNumGeneraciones = null;
    private JCheckBox checkVariarTamPoblacion = null;
    private JLabel labelTitleMinValor211 = null;
    private JTextField valorMinimoTamPoblacion = null;
    private JLabel labelTitleMaxValor111 = null;
    private JTextField valorMaximoTamPoblacion = null;
    private JLabel labelTitlePaso111 = null;
    private JTextField pasoTamPoblacion = null;
    private JLabel labelPorElitismo = null;
    private JTextField textPorElitismo = null;
    private JLabel labelPorciento = null;
    private JTextArea textAyuda = null;
    private JLabel labelRate = null;
    private JTextField textRate = null;
    private JLabel labelElitismo1 = null;
    private JComboBox comboSeleccion = null;
    private JCheckBox checkVariarMetSeleccion = null;
    private JLabel labelMutacion = null;
    private JComboBox comboMutacion = null;
    private JLabel labelAlturaArbol = null;
	private JLabel labelOpcionIf = null;
	private JTextField textAlturaArbol = null;
	private JCheckBox checkIf = null;
	private JLabel labelCompleta = null;
	private JCheckBox checkCompleta = null;
    /**
     * This is the default constructor
     */
    public PanelPrincipal() {
        super();
        initialize();
        visibleOpciones(false);
    }

    /**
     * This method initializes this
     *
     * @return void
     */
    private void initialize() {
        autoresLabel = new JLabel();
        autoresLabel.setBounds(new Rectangle(17, 716, 359, 16));
        autoresLabel.setText("Autores: Daniel Martín Carabias, Raúl Requero García");
        tituloLabel = new JLabel();
        tituloLabel.setFont(new Font("Dialog", Font.BOLD, 18));
        tituloLabel.setBounds(new Rectangle(96, 27, 410, 29));
        tituloLabel.setText("Algoritmo genético: Problema del multiplexor");
        this.setSize(680, 744);
        this.setLayout(null);
        this.setPreferredSize(new Dimension(507, 520));
        this.add(tituloLabel, null);
        this.add(autoresLabel, null);
        this.add(getPestanasTabbedPane(), null);

        // labelValueProbMut = new JLabel();

    }

    /**
     * This method initializes pestanasTabbedPane
     *
     * @return javax.swing.JTabbedPane
     */
    private JTabbedPane getPestanasTabbedPane() {
        if (pestanasTabbedPane == null) {
            pestanasTabbedPane = new JTabbedPane();
            pestanasTabbedPane.setBounds(new Rectangle(48, 87, 590, 618));
            pestanasTabbedPane.addTab("Ejecución", new ImageIcon(getClass().getResource("/gui2/FormulaEvaluatorHS.png")),
                    getAlgoritmoPanel(), null);
            /*pestanasTabbedPane.addTab("Estudio", new ImageIcon(getClass().getResource("/gui/FormulaEvaluatorHS.png")), getEstudio(),
            null);*/
            pestanasTabbedPane.addTab("Ayuda", new ImageIcon(getClass().getResource("/gui2/Help.png")), getAyudaPanel(), null);
        }
        return pestanasTabbedPane;
    }

    public JPanel getEstudio() {
        if (estudio == null) {

            labelTitlePaso111 = new JLabel();
            labelTitlePaso111.setBounds(new Rectangle(398, 358, 74, 19));
            labelTitlePaso111.setText("Paso");
            labelTitleMaxValor111 = new JLabel();
            labelTitleMaxValor111.setBounds(new Rectangle(225, 359, 90, 19));
            labelTitleMaxValor111.setText("Valor máximo");
            labelTitleMinValor211 = new JLabel();
            labelTitleMinValor211.setBounds(new Rectangle(62, 359, 90, 18));
            labelTitleMinValor211.setText("Valor mínimo");
            labelTitlePaso11 = new JLabel();
            labelTitlePaso11.setBounds(new Rectangle(400, 270, 75, 19));
            labelTitlePaso11.setText("Paso");
            labelTitleMaxValor11 = new JLabel();
            labelTitleMaxValor11.setBounds(new Rectangle(226, 269, 90, 19));
            labelTitleMaxValor11.setText("Valor máximo");
            labelTitleMinValor21 = new JLabel();
            labelTitleMinValor21.setBounds(new Rectangle(62, 269, 90, 19));
            labelTitleMinValor21.setText("Valor mínimo");
            labelTitlePaso1 = new JLabel();
            labelTitlePaso1.setBounds(new Rectangle(401, 179, 73, 19));
            labelTitlePaso1.setText("Paso");
            labelTitleMaxValor1 = new JLabel();
            labelTitleMaxValor1.setBounds(new Rectangle(225, 180, 90, 19));
            labelTitleMaxValor1.setText("Valor máximo");
            labelTitleMinValor2 = new JLabel();
            labelTitleMinValor2.setBounds(new Rectangle(63, 179, 86, 19));
            labelTitleMinValor2.setText("Valor mínimo");
            labelTitlePaso = new JLabel();
            labelTitlePaso.setBounds(new Rectangle(397, 82, 75, 19));
            labelTitlePaso.setText("Paso");
            labelTitleMaxValor = new JLabel();
            labelTitleMaxValor.setBounds(new Rectangle(224, 82, 91, 19));
            labelTitleMaxValor.setText("Valor máximo");
            labelTitleMinValor1 = new JLabel();
            labelTitleMinValor1.setBounds(new Rectangle(64, 82, 85, 19));
            labelTitleMinValor1.setText("Valor mínimo");
            estudio = new JPanel();
            estudio.setLayout(null);
            estudio.add(labelTitleMinValor1, null);
            estudio.add(getCheckVariarProbCruce(), null);
            estudio.add(getValorMinimoProbCruce(), null);
            estudio.add(labelTitleMaxValor, null);
            estudio.add(labelTitlePaso, null);
            estudio.add(getValorMaximoProbCruce(), null);
            estudio.add(getPasoProbCruce(), null);
            estudio.add(getCheckEstudio(), null);
            estudio.add(getCheckVariarProbMutacion(), null);
            estudio.add(labelTitleMinValor2, null);
            estudio.add(getValorMinimoProbMutacion(), null);
            estudio.add(labelTitleMaxValor1, null);
            estudio.add(getValorMaximoProbMutacion(), null);
            estudio.add(labelTitlePaso1, null);
            estudio.add(getPasoProbMutacion(), null);
            estudio.add(getCheckVariarNumGeneraciones(), null);
            estudio.add(labelTitleMinValor21, null);
            estudio.add(getValorMinimoNumGeneraciones(), null);
            estudio.add(labelTitleMaxValor11, null);
            estudio.add(getValorMaximoNumGeneraciones(), null);
            estudio.add(labelTitlePaso11, null);
            estudio.add(getPasoNumGeneraciones(), null);
            estudio.add(getCheckVariarTamPoblacion(), null);
            estudio.add(labelTitleMinValor211, null);
            estudio.add(getValorMinimoTamPoblacion(), null);
            estudio.add(labelTitleMaxValor111, null);
            estudio.add(getValorMaximoTamPoblacion(), null);
            estudio.add(labelTitlePaso111, null);
            estudio.add(getPasoTamPoblacion(), null);
            estudio.add(getCheckVariarMetSeleccion(), null);

        }
        return estudio;
    }

    /**
     * This method initializes algoritmoPanel
     *
     * @return javax.swing.JPanel
     */
    private JPanel getAlgoritmoPanel() {
        if (algoritmoPanel == null) {
            labelCompleta = new JLabel();
            labelCompleta.setBounds(new Rectangle(70, 523, 200, 26));
            labelCompleta.setText("Inicialización completa:");
            labelOpcionIf = new JLabel();
            labelOpcionIf.setBounds(new Rectangle(69, 499, 203, 20));
            labelOpcionIf.setText("Con IF:");
            labelAlturaArbol = new JLabel();
            labelAlturaArbol.setBounds(new Rectangle(70, 462, 198, 30));
            labelAlturaArbol.setText("Altura del árbol:");
            labelRate = new JLabel();
            labelRate.setBounds(new Rectangle(360, 462, 100, 30));
            labelRate.setText("Penalización (%):");
            labelMutacion = new JLabel();
            labelMutacion.setBounds(new Rectangle(70, 423, 197, 24));
            labelMutacion.setText("Método de mutación");
            labelElitismo1 = new JLabel();
            labelElitismo1.setBounds(new Rectangle(72, 383, 189, 21));
            labelElitismo1.setText("Método de selección");
            labelPorciento = new JLabel();
            labelPorciento.setBounds(new Rectangle(461, 338, 49, 31));
            labelPorciento.setText("%");
            labelPorciento.setVisible(false);
            labelPorElitismo = new JLabel();
            labelPorElitismo.setBounds(new Rectangle(72, 345, 332, 22));
            labelPorElitismo.setText("Porcentaje de elitismo (se recomienda que sea bajo)");
            labelPorElitismo.setVisible(false);
            labelElitismo = new JLabel();
            labelElitismo.setBounds(new Rectangle(72, 315, 192, 22));
            labelElitismo.setText("Elitismo");
            labelTitleTolerancia = new JLabel();
            labelTitleTolerancia.setBounds(new Rectangle(73, 282, 192, 16));
            labelTitleTolerancia.setText("Escalado");
            labelTitleNumMaxGeneraciones = new JLabel();
            labelTitleNumMaxGeneraciones.setBounds(new Rectangle(72, 246, 205,
                    16));
            labelTitleNumMaxGeneraciones.setText("Número máximo de generaciones");
            labelTitleTamanioPoblacion = new JLabel();
            labelTitleTamanioPoblacion.setBounds(new Rectangle(74, 201, 124, 16));
            labelTitleTamanioPoblacion.setText("Tamaño población");
            labelValueProbCruc = new JLabel();
            labelValueProbCruc.setBounds(new Rectangle(399, 158, 54, 23));
            labelValueProbCruc.setText("0.6");
            labelTitleProbCruce = new JLabel();
            labelTitleProbCruce.setBounds(new Rectangle(73, 126, 144, 16));
            labelTitleProbCruce.setText("Probabilidad de cruce");
            labelTitleProbMut = new JLabel();
            labelTitleProbMut.setBounds(new Rectangle(75, 54, 153, 20));
            labelTitleProbMut.setText("Probabilidad de mutación");
            labelValueProbMut = new JLabel();
            labelValueProbMut.setBounds(new Rectangle(399, 85, 52, 27));
            labelValueProbMut.setText("0.30");
            instruccionesLabel = new JLabel();
            instruccionesLabel.setText("Configure el algoritmo y haga clic sobre Ejecutar.");
            instruccionesLabel.setBounds(new Rectangle(13, 11, 285, 16));
            algoritmoPanel = new JPanel();
            algoritmoPanel.setLayout(null);
            algoritmoPanel.add(instruccionesLabel, null);
            algoritmoPanel.add(getEjecutarBoton(), null);
            probMutacion = new JSlider(0, 100, 30);
            probMutacion.setMajorTickSpacing(1);
            probMutacion.setBounds(new Rectangle(75, 87, 317, 27));
            probMutacion.setPaintTicks(true);
            probMutacion.addChangeListener(new ChangeListener() {

                @Override
                public void stateChanged(ChangeEvent arg0) {
                    // TODO Auto-generated method stub
                    labelValueProbMut.setText((double) probMutacion.getValue() / 100 + "");
                }
            });
            algoritmoPanel.add(probMutacion);

            probCruce = new JSlider(0, 100, 60);
            probCruce.setMajorTickSpacing(1);
            probCruce.setBounds(new Rectangle(72, 159, 318, 27));
            probCruce.setPaintTicks(true);
            probCruce.addChangeListener(new ChangeListener() {

                @Override
                public void stateChanged(ChangeEvent arg0) {
                    // TODO Auto-generated method stub
                    labelValueProbCruc.setText((double) probCruce.getValue() / 100 + "");
                }
            });

            algoritmoPanel.add(labelValueProbMut);
            algoritmoPanel.add(labelTitleProbMut, null);
            algoritmoPanel.add(labelTitleProbCruce, null);
            algoritmoPanel.add(labelValueProbCruc, null);
            algoritmoPanel.add(probCruce, null);
            algoritmoPanel.add(getTamanioPoblacion(), null);
            algoritmoPanel.add(labelTitleTamanioPoblacion, null);
            algoritmoPanel.add(labelTitleNumMaxGeneraciones, null);
            algoritmoPanel.add(getNumMaximoGeneraciones(), null);
            algoritmoPanel.add(labelTitleTolerancia, null);
            algoritmoPanel.add(getTolerancia(), null);
            algoritmoPanel.add(labelElitismo, null);
            algoritmoPanel.add(getCheckElitismo(), null);
            algoritmoPanel.add(labelPorElitismo, null);
            algoritmoPanel.add(getTextPorElitismo(), null);
            algoritmoPanel.add(labelPorciento, null);
            algoritmoPanel.add(labelElitismo1, null);
            algoritmoPanel.add(getComboSeleccion(), null);
            algoritmoPanel.add(labelMutacion, null);
            algoritmoPanel.add(getComboMutacion(), null);
            algoritmoPanel.add(getEscaladoValor(), null);
            algoritmoPanel.add(labelAlturaArbol, null);
            algoritmoPanel.add(labelOpcionIf, null);
            algoritmoPanel.add(labelRate);
            algoritmoPanel.add(getTextAlturaArbol(), null);
            algoritmoPanel.add(getTextRate(), null);
            algoritmoPanel.add(getCheckIf(), null);
            algoritmoPanel.add(labelCompleta, null);
            algoritmoPanel.add(getCheckCompleta(), null);
        }
        return algoritmoPanel;
    }

    /**
     * This method initializes ejecutarBoton
     *
     * @return javax.swing.JButton
     */
    private JButton getEjecutarBoton() {
        if (ejecutarBoton == null) {
            ejecutarBoton = new JButton();
            ejecutarBoton.setBounds(new Rectangle(221, 556, 157, 25));
            ejecutarBoton.setIcon(new ImageIcon(getClass().getResource(
                    "/gui2/FormRunHS.png")));
            ejecutarBoton.setText("Ejecutar");
            ejecutarBoton.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    InformacionBean informacion = recopilarDatos();
                    if (informacion != null) {
                        ProgresoJFrame progreso = new ProgresoJFrame();
                        ResultadosJFrame result = new ResultadosJFrame();
                        // seleccionFuncion = new SeleccionFuncion(informacion);
                        Controlador controlador = new Controlador(informacion,
                                result, progreso);
                        controlador.start();

                    }
                }
            });
        }
        return ejecutarBoton;
    }

    private InformacionBean recopilarDatos() {
        // NUEVO: Validamos par�metros
        try {
            if (numMaximoGeneraciones.getText().isEmpty() || Integer.parseInt(numMaximoGeneraciones.getText()) < 1) {
                JOptionPane.showMessageDialog(
                        null,
                        "Debe introducir un número máximo de generaciones superior a 0",
                        "Error", 1);
                return null;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(
                    null,
                    "Debe introducir un número para el número máximo de generaciones, superior a 0",
                    "Error", 1);
            return null;
        }
        try {
            if (tamanioPoblacion.getText().isEmpty() || Integer.parseInt(tamanioPoblacion.getText()) < 1) {
                JOptionPane.showMessageDialog(null,
                        "Debe introducir un tamaño de población superior a 0",
                        "Error", 1);
                return null;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    "Debe introducir un número para el tamaño de población superior a 0",
                    "Error", 1);
            return null;


        }

        try {
            if (escalado.isSelected()) {
                if (escaladoValor.getText().isEmpty() || Double.parseDouble(escaladoValor.getText()) == 0) {
                    JOptionPane.showMessageDialog(null,
                            "Debe introducir un valor correcto para el valor del escalado",
                            "Error", 1);
                    return null;
                }
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    "Debe introducir un número para el valor del escalado",
                    "Error", 1);
            return null;


        }

         try {

                if (textRate.getText().isEmpty() || Double.parseDouble(textRate.getText()) == -1) {
                    JOptionPane.showMessageDialog(null,
                            "Debe introducir un valor correcto para el valor del rate",
                            "Error", 1);
                    return null;
                }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    "Debe introducir un número para el valor del rate",
                    "Error", 1);
            return null;


        }


        InformacionBean informacion = new InformacionBean();
        informacion.setRate((1- Double.parseDouble(textRate.getText()))/(double)100);
        informacion.setValorEscalado(Double.parseDouble(escaladoValor.getText()));
        informacion.setProbMutacion((double) ((double) probMutacion.getValue() / 100));
        informacion.setProbCruce((double) ((double) probCruce.getValue() / 100));
        informacion.setMaxGeneraciones(Integer.parseInt(numMaximoGeneraciones.getText()));
        informacion.setTamanioPoblacion(Integer.parseInt(tamanioPoblacion.getText()));
        informacion.setEscalado(escalado.isSelected());

        informacion.setElitismo(checkElitismo.isSelected());
        if (checkElitismo.isSelected()) {
            informacion.setPorcentajeElitismo(Integer.parseInt(textPorElitismo.getText()));
        }
        informacion.setSeleccionReproduccion(comboSeleccion.getSelectedIndex());
//        informacion.setSeleccionCruce(comboCruce.getSelectedIndex());
        informacion.setSeleccionMutacion(comboMutacion.getSelectedIndex());
  //      informacion.setSeleccionParte(comboPartePractica.getSelectedIndex());
        informacion.setCompleta(checkCompleta.isSelected());
        ArrayList<String> cjtoFunc = new ArrayList<String>();
        cjtoFunc.add("AND");
        cjtoFunc.add("OR");
        cjtoFunc.add("NOT");
        
        if (checkIf.isSelected()) {
        	cjtoFunc.add("IF");
        }
        informacion.setCjtoFun(cjtoFunc);
        ArrayList<String> cjtoTerm = new ArrayList<String>();
        cjtoTerm.add("A0");
        cjtoTerm.add("A1");
        cjtoTerm.add("D0");
        cjtoTerm.add("D1");
        cjtoTerm.add("D2");
        cjtoTerm.add("D3");
        informacion.setCjtoTer(cjtoTerm);
        informacion.setCompleta(checkCompleta.isSelected());
        informacion.setHmax(Integer.parseInt(textAlturaArbol.getText()));

        //informacion.setRealizarEstudio(checkEstudio.isSelected());
        /*if (checkEstudio.isSelected()) {
        informacion.setInfoEstudio(recopilarDatosEstudio());
        // Hago esto para empezar desde el principio
        informacion.setProbMutacion(informacion.getInfoEstudio().getValorMinProbMutacion());
        informacion.setProbCruce(informacion.getInfoEstudio().getValorMinProbCruce());
        informacion.setMaxGeneraciones(informacion.getInfoEstudio().getValorMinNumGeneraciones());
        informacion.setTamanioPoblacion(informacion.getInfoEstudio().getValorMinTamPoblacion());
        }*/

        return informacion;
    }

    private EstudioBean recopilarDatosEstudio() {
        // obtenemos la informaciones
        EstudioBean estudioBean = new EstudioBean();
        estudioBean.setEstudioNumGeneraciones(checkVariarNumGeneraciones.isSelected());
        if (estudioBean.isEstudioNumGeneraciones()) {
            estudioBean.setPasoNumGeneraciones(Integer.parseInt(pasoNumGeneraciones.getText()));
            estudioBean.setValorMaxNumGeneraciones(Integer.parseInt(valorMaximoNumGeneraciones.getText()));
            estudioBean.setValorMinNumGeneraciones(Integer.parseInt(valorMinimoNumGeneraciones.getText()));
        } else {
            estudioBean.setPasoNumGeneraciones(1);
            estudioBean.setValorMaxNumGeneraciones(Integer.parseInt(numMaximoGeneraciones.getText()));
            estudioBean.setValorMinNumGeneraciones(Integer.parseInt(numMaximoGeneraciones.getText()));
        }
        estudioBean.setEstudioProbCruce(checkVariarProbCruce.isSelected());
        if (estudioBean.isEstudioProbCruce()) {
            estudioBean.setPasoProbCruce(Double.parseDouble(pasoProbCruce.getText()));
            estudioBean.setValorMaxProbCruce(Double.parseDouble(valorMaximoProbCruce.getText()));
            estudioBean.setValorMinProbCruce(Double.parseDouble(valorMinimoProbCruce.getText()));
        } else {
            estudioBean.setPasoProbCruce(1);
            estudioBean.setValorMaxProbCruce((double) ((double) probCruce.getValue() / 100));
            estudioBean.setValorMinProbCruce((double) ((double) probCruce.getValue() / 100));
        }

        estudioBean.setEstudioProbMutacion(checkVariarProbMutacion.isSelected());
        if (estudioBean.isEstudioProbMutacion()) {
            estudioBean.setPasoProbMutacion(Double.parseDouble(pasoProbMutacion.getText()));
            estudioBean.setValorMaxProbMutacion(Double.parseDouble(valorMaximoProbMutacion.getText()));
            estudioBean.setValorMinProbMutacion(Double.parseDouble(valorMinimoProbMutacion.getText()));
        } else {
            estudioBean.setPasoProbMutacion(1);
            estudioBean.setValorMaxProbMutacion((double) ((double) probMutacion.getValue() / 100));
            estudioBean.setValorMinProbMutacion((double) ((double) probMutacion.getValue() / 100));
        }

        estudioBean.setEstudioTamPoblacion(checkVariarTamPoblacion.isSelected());
        if (estudioBean.isEstudioTamPoblacion()) {
            estudioBean.setPasoTamPoblacion(Integer.parseInt(pasoTamPoblacion.getText()));
            estudioBean.setValorMaxTamPoblacion(Integer.parseInt(valorMaximoTamPoblacion.getText()));
            estudioBean.setValorMinTamPoblacion(Integer.parseInt(valorMinimoTamPoblacion.getText()));
        } else {
            estudioBean.setPasoTamPoblacion(1);
            estudioBean.setValorMaxTamPoblacion(Integer.parseInt(tamanioPoblacion.getText()));
            estudioBean.setValorMinTamPoblacion(Integer.parseInt(tamanioPoblacion.getText()));
        }
        estudioBean.setEstudioMetSeleccion(checkVariarMetSeleccion.isSelected());
        return estudioBean;
    }

    /**
     * This method initializes ayudaPanel
     *
     * @return javax.swing.JPanel
     */
    private JPanel getAyudaPanel() {
        if (ayudaPanel == null) {
            ayudaPanel = new JPanel();
            ayudaPanel.setLayout(null);
            ayudaPanel.add(getTextAyuda(), null);
        }
        return ayudaPanel;
    }

    /**
     * This method initializes tamanioPoblacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getTamanioPoblacion() {
        if (tamanioPoblacion == null) {
            tamanioPoblacion = new JTextField();
            tamanioPoblacion.setBounds(new Rectangle(310, 199, 56, 25));
            tamanioPoblacion.setText("300");
        }
        return tamanioPoblacion;
    }

    /**
     * This method initializes numMaximoGeneraciones
     *
     * @return javax.swing.JTextField
     */
    private JTextField getNumMaximoGeneraciones() {
        if (numMaximoGeneraciones == null) {
            numMaximoGeneraciones = new JTextField();
            numMaximoGeneraciones.setBounds(new Rectangle(311, 241, 56, 25));
            numMaximoGeneraciones.setText("150");
        }
        return numMaximoGeneraciones;
    }

    /**
     * This method initializes tolerancia
     *
     * @return javax.swing.JTextField
     */
    private JCheckBox getTolerancia() {
        if (escalado == null) {
            escalado = new JCheckBox();
            escalado.setBounds(new Rectangle(333, 280, 28, 25));

        }
        return escalado;
    }

    private JTextField getEscaladoValor() {
        if (escaladoValor == null) {
            escaladoValor = new JTextField();
            escaladoValor.setBounds(new Rectangle(375, 280, 45, 25));
            escaladoValor.setText("1.5");
        }
        return escaladoValor;
    }

    /**
     * This method initializes checkElitismo
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckElitismo() {
        if (checkElitismo == null) {
            checkElitismo = new JCheckBox();
            checkElitismo.setBounds(new Rectangle(333, 316, 28, 22));
            checkElitismo.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkElitismo.isSelected()) {
                        labelPorElitismo.setVisible(true);
                        textPorElitismo.setVisible(true);
                        labelPorciento.setVisible(true);
                    } else {
                        labelPorElitismo.setVisible(false);
                        textPorElitismo.setVisible(false);
                        labelPorciento.setVisible(false);
                    }
                }
            });
        }
        return checkElitismo;
    }

    /**
     * This method initializes checkVariarProbCruce
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckVariarProbCruce() {
        if (checkVariarProbCruce == null) {
            checkVariarProbCruce = new JCheckBox();
            checkVariarProbCruce.setBounds(new Rectangle(40, 48, 212, 21));
            checkVariarProbCruce.setText("Variar la probabilidad de cruce");
            checkVariarProbCruce.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkVariarProbCruce.isSelected()) {
                        valorMaximoProbCruce.enable();
                        valorMinimoProbCruce.enable();
                        pasoProbCruce.enable();
                    } else {
                        valorMaximoProbCruce.disable();
                        valorMinimoProbCruce.disable();
                        pasoProbCruce.disable();
                    }
                }
            });
        }
        return checkVariarProbCruce;
    }

    /**
     * This method initializes valorMinimoProbCruce
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMinimoProbCruce() {
        if (valorMinimoProbCruce == null) {
            valorMinimoProbCruce = new JTextField();
            valorMinimoProbCruce.setBounds(new Rectangle(149, 82, 56, 20));
        }
        return valorMinimoProbCruce;
    }

    /**
     * This method initializes valorMaximoProbCruce
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMaximoProbCruce() {
        if (valorMaximoProbCruce == null) {
            valorMaximoProbCruce = new JTextField();
            valorMaximoProbCruce.setBounds(new Rectangle(314, 82, 66, 20));
        }
        return valorMaximoProbCruce;
    }

    /**
     * This method initializes pasoProbCruce
     *
     * @return javax.swing.JTextField
     */
    private JTextField getPasoProbCruce() {
        if (pasoProbCruce == null) {
            pasoProbCruce = new JTextField();
            pasoProbCruce.setBounds(new Rectangle(472, 82, 53, 20));
        }
        return pasoProbCruce;
    }

    /**
     * This method initializes checkEstudio
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckEstudio() {
        if (checkEstudio == null) {
            checkEstudio = new JCheckBox();
            checkEstudio.setBounds(new Rectangle(22, 13, 174, 21));
            checkEstudio.setText("Realizar estudio");
            checkEstudio.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkEstudio.isSelected()) {
                        visibleOpciones(true);
                    } else {
                        visibleOpciones(false);
                    }
                }
            });
            checkEstudio.setSelected(false);

        }
        return checkEstudio;
    }

    public void visibleOpciones(boolean flag) {
        /*checkVariarMetSeleccion.setVisible(flag);
        checkVariarNumGeneraciones.setVisible(flag);
        checkVariarProbCruce.setVisible(flag);
        checkVariarProbMutacion.setVisible(flag);
        checkVariarTamPoblacion.setVisible(flag);
        labelTitleMinValor1.setVisible(flag);
        checkVariarProbCruce.setVisible(flag);
        valorMinimoProbCruce.setVisible(flag);
        labelTitleMaxValor.setVisible(flag);
        labelTitlePaso.setVisible(flag);
        valorMaximoProbCruce.setVisible(flag);
        pasoProbCruce.setVisible(flag);
        checkVariarProbMutacion.setVisible(flag);
        labelTitleMinValor2.setVisible(flag);
        valorMinimoProbMutacion.setVisible(flag);
        labelTitleMaxValor1.setVisible(flag);
        valorMaximoProbMutacion.setVisible(flag);
        labelTitlePaso1.setVisible(flag);
        pasoProbMutacion.setVisible(flag);
        labelTitleMinValor21.setVisible(flag);
        valorMinimoNumGeneraciones.setVisible(flag);
        labelTitleMaxValor11.setVisible(flag);
        valorMaximoNumGeneraciones.setVisible(flag);
        labelTitlePaso11.setVisible(flag);
        pasoNumGeneraciones.setVisible(flag);

        labelTitleMinValor211.setVisible(flag);
        valorMinimoTamPoblacion.setVisible(flag);
        labelTitleMaxValor111.setVisible(flag);
        valorMaximoTamPoblacion.setVisible(flag);
        labelTitlePaso111.setVisible(flag);
        pasoTamPoblacion.setVisible(flag);*/
    }

    /**
     * This method initializes checkVariarProbMutacion
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckVariarProbMutacion() {
        if (checkVariarProbMutacion == null) {
            checkVariarProbMutacion = new JCheckBox();
            checkVariarProbMutacion.setBounds(new Rectangle(41, 140, 238, 24));
            checkVariarProbMutacion.setText("Variar la probabilidad de mutación");
            checkVariarProbMutacion.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkVariarProbMutacion.isSelected()) {
                        valorMaximoProbMutacion.enable();
                        valorMinimoProbMutacion.enable();
                        pasoProbMutacion.enable();
                    } else {
                        valorMaximoProbMutacion.disable();
                        valorMinimoProbMutacion.disable();
                        pasoProbMutacion.disable();
                    }
                }
            });
        }
        return checkVariarProbMutacion;
    }

    /**
     * This method initializes valorMinimoProbMutacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMinimoProbMutacion() {
        if (valorMinimoProbMutacion == null) {
            valorMinimoProbMutacion = new JTextField();
            valorMinimoProbMutacion.setBounds(new Rectangle(148, 180, 54, 18));
        }
        return valorMinimoProbMutacion;
    }

    /**
     * This method initializes valorMaximoProbMutacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMaximoProbMutacion() {
        if (valorMaximoProbMutacion == null) {
            valorMaximoProbMutacion = new JTextField();
            valorMaximoProbMutacion.setBounds(new Rectangle(314, 180, 62, 19));
        }
        return valorMaximoProbMutacion;
    }

    /**
     * This method initializes pasoProbMutacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getPasoProbMutacion() {
        if (pasoProbMutacion == null) {
            pasoProbMutacion = new JTextField();
            pasoProbMutacion.setBounds(new Rectangle(475, 179, 46, 20));
        }
        return pasoProbMutacion;
    }

    /**
     * This method initializes checkVariarNumGeneraciones
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckVariarNumGeneraciones() {
        if (checkVariarNumGeneraciones == null) {
            checkVariarNumGeneraciones = new JCheckBox();
            checkVariarNumGeneraciones.setBounds(new Rectangle(42, 227, 217, 24));
            checkVariarNumGeneraciones.setText("Variar el número generaciones");
            checkVariarNumGeneraciones.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkVariarNumGeneraciones.isSelected()) {
                        valorMaximoNumGeneraciones.enable();
                        valorMinimoNumGeneraciones.enable();
                        pasoNumGeneraciones.enable();
                    } else {
                        valorMaximoNumGeneraciones.disable();
                        valorMinimoNumGeneraciones.disable();
                        pasoNumGeneraciones.disable();
                    }
                }
            });
        }
        return checkVariarNumGeneraciones;
    }

    /**
     * This method initializes valorMinimoNumGeneraciones
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMinimoNumGeneraciones() {
        if (valorMinimoNumGeneraciones == null) {
            valorMinimoNumGeneraciones = new JTextField();
            valorMinimoNumGeneraciones.setBounds(new Rectangle(152, 269, 49, 20));
        }
        return valorMinimoNumGeneraciones;
    }

    /**
     * This method initializes valorMaximoNumGeneraciones
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMaximoNumGeneraciones() {
        if (valorMaximoNumGeneraciones == null) {
            valorMaximoNumGeneraciones = new JTextField();
            valorMaximoNumGeneraciones.setBounds(new Rectangle(316, 269, 61, 20));
        }
        return valorMaximoNumGeneraciones;
    }

    /**
     * This method initializes pasoNumGeneraciones
     *
     * @return javax.swing.JTextField
     */
    private JTextField getPasoNumGeneraciones() {
        if (pasoNumGeneraciones == null) {
            pasoNumGeneraciones = new JTextField();
            pasoNumGeneraciones.setBounds(new Rectangle(475, 270, 48, 20));
        }
        return pasoNumGeneraciones;
    }

    /**
     * This method initializes checkVariarTamPoblacion
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckVariarTamPoblacion() {
        if (checkVariarTamPoblacion == null) {
            checkVariarTamPoblacion = new JCheckBox();
            checkVariarTamPoblacion.setBounds(new Rectangle(42, 315, 251, 24));
            checkVariarTamPoblacion.setText("Variar el tamaño de la población");
            checkVariarTamPoblacion.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (checkVariarTamPoblacion.isSelected()) {
                        valorMaximoTamPoblacion.enable();
                        valorMinimoTamPoblacion.enable();
                        pasoTamPoblacion.enable();
                    } else {
                        valorMaximoTamPoblacion.disable();
                        valorMinimoTamPoblacion.disable();
                        pasoTamPoblacion.disable();
                    }
                }
            });
        }
        return checkVariarTamPoblacion;
    }

    /**
     * This method initializes valorMinimoTamPoblacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMinimoTamPoblacion() {
        if (valorMinimoTamPoblacion == null) {
            valorMinimoTamPoblacion = new JTextField();
            valorMinimoTamPoblacion.setBounds(new Rectangle(151, 359, 50, 19));
        }
        return valorMinimoTamPoblacion;
    }

    /**
     * This method initializes valorMaximoTamPoblacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getValorMaximoTamPoblacion() {
        if (valorMaximoTamPoblacion == null) {
            valorMaximoTamPoblacion = new JTextField();
            valorMaximoTamPoblacion.setBounds(new Rectangle(314, 359, 62, 20));
        }
        return valorMaximoTamPoblacion;
    }

    /**
     * This method initializes pasoTamPoblacion
     *
     * @return javax.swing.JTextField
     */
    private JTextField getPasoTamPoblacion() {
        if (pasoTamPoblacion == null) {
            pasoTamPoblacion = new JTextField();
            pasoTamPoblacion.setBounds(new Rectangle(473, 358, 54, 20));
        }
        return pasoTamPoblacion;
    }

    /**
     * This method initializes textPorElitismo
     *
     * @return javax.swing.JTextField
     */
    private JTextField getTextPorElitismo() {
        if (textPorElitismo == null) {
            textPorElitismo = new JTextField();
            textPorElitismo.setBounds(new Rectangle(424, 345, 33, 31));
            textPorElitismo.setText("0");
            textPorElitismo.setVisible(false);
        }
        return textPorElitismo;
    }

    /**
     * This method initializes textAyuda
     *
     * @return javax.swing.JTextArea
     */
    private JTextArea getTextAyuda() {
        if (textAyuda == null) {
            textAyuda = new JTextArea();
            textAyuda.setBounds(new Rectangle(34, 35, 517, 257));
            textAyuda.setLineWrap(true);
            textAyuda.setEditable(false);
            textAyuda.setText("   Nuestra aplicación consta de dos apartados: Estudio individual de un algoritmo genético con unos parámetros dados y Estudio de un algorimo " + " genético al cual se le varían sus parámetros dentro de unos determinados rangos proporcionados por el usuario.\n" + "    Al hacer clic sobre la pestañaa Ejecución, el usuario puede configurar el algoritmo genético" + " a su gusto, n�mero m�ximo de generaciones, tamñoo de la población inicial," + " si desea incluir el elitismo en su ejecuci�n y qu� porcentaje del mismo, as� como la tolerancia (precisi�n requerida). ");
        }
        return textAyuda;
    }

    /**
     * This method initializes comboSeleccion
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboSeleccion() {
        if (comboSeleccion == null) {
            comboSeleccion = new JComboBox();
            comboSeleccion.setBounds(new Rectangle(283, 388, 231, 22));
            comboSeleccion.addItem("Selección por ruleta");
          
            comboSeleccion.addItem("Selección por torneo");
            comboSeleccion.addItem("Selección por ranking");
        }
        return comboSeleccion;
    }

    /**
     * This method initializes checkVariarMetSeleccion
     *
     * @return javax.swing.JCheckBox
     */
    private JCheckBox getCheckVariarMetSeleccion() {
        if (checkVariarMetSeleccion == null) {
            checkVariarMetSeleccion = new JCheckBox();
            checkVariarMetSeleccion.setBounds(new Rectangle(42, 405, 207, 24));
            checkVariarMetSeleccion.setText("Variar método de selecci�n");
        }
        return checkVariarMetSeleccion;
    }

    /**
     * This method initializes comboMutacion
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboMutacion() {
        if (comboMutacion == null) {
            comboMutacion = new JComboBox();
            comboMutacion.setBounds(new Rectangle(281, 423, 232, 24));
            comboMutacion.addItem("Mutación Funcional");
            comboMutacion.addItem("Mutación Terminal");
            comboMutacion.addItem("Mutación de árbol");
            comboMutacion.addItem("Mutación por método propio");
             comboMutacion.addItem("Mutación por método propio para if");
        }
        return comboMutacion;
    }

	/**
	 * This method initializes textAlturaArbol	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTextAlturaArbol() {
		if (textAlturaArbol == null) {
			textAlturaArbol = new JTextField();
			textAlturaArbol.setBounds(new Rectangle(283, 462, 49, 28));
		}
		return textAlturaArbol;
	}

        private JTextField getTextRate() {
		if (textRate == null) {
			textRate = new JTextField();
			textRate.setBounds(new Rectangle(470, 462, 49, 28));
		}
		return textRate;
	}

	/**
	 * This method initializes checkIf	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getCheckIf() {
		if (checkIf == null) {
			checkIf = new JCheckBox();
			checkIf.setBounds(new Rectangle(285, 501, 27, 19));
		}
		return checkIf;
	}

	/**
	 * This method initializes checkCompleta	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getCheckCompleta() {
		if (checkCompleta == null) {
			checkCompleta = new JCheckBox();
			checkCompleta.setBounds(new Rectangle(284, 528, 26, 23));
		}
		return checkCompleta;
	}
} // @jve:decl-index=0:visual-constraint="10,10"

